/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package xsystems.parserFile;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import xsystems.GUI.Principal;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import java.awt.BorderLayout;
import java.io.LineNumberReader;
import xsystems.propagationModel.ImportedModel;

/**
 * Classe responsável de extrair os dados do arquivo.
 *
 * @author Rafael Tosta
 */
public class ParserFileASC extends Thread {

    private final String file;
    private String measurement;
    private String description;
    private ArrayList<Data> data;
    private Principal frame;

    private JDialog dlg;
    private JProgressBar dpb;

    public ParserFileASC(String file, Principal frame) {
        this.file = file;
        this.measurement = "";
        this.description = "";
        this.data = new ArrayList<>();
        this.frame = frame;
    }

    @Override
    public void run() {

        iniciaProgress();

        parserFile();

        dlg.setVisible(false);
        frame.showImportedFiles();
    }

    private void iniciaProgress() {
        int qtdLinha = 0;
        try {
            File arq = new File(this.file);
            FileReader reader = new FileReader(this.file);
            LineNumberReader linhaLeitura = new LineNumberReader(reader);
            linhaLeitura.skip(arq.length());
            qtdLinha = linhaLeitura.getLineNumber();
        } catch (Exception ex) {
        }

        dlg = new JDialog(frame, "Progress Dialog", true);
        dpb = new JProgressBar(0, qtdLinha);
        dlg.add(BorderLayout.CENTER, dpb);
        dlg.add(BorderLayout.NORTH, new JLabel("Progress..."));
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setSize(300, 75);
        dlg.setLocationRelativeTo(frame);

        Thread t = new Thread(new Runnable() {
            public void run() {
                dlg.setVisible(true);
            }
        });
        t.start();
    }

    public void parserFile() {
        boolean flag1 = false;
        boolean flag2 = false;
        boolean flag3 = false;

        String pathArq = this.file;
        String linha = "";
        File arq = new File(pathArq);
        int k = 1;
        //Arquivo existe
        if (arq.exists()) {
            //tentando ler arquivo
            try {
                //abrindo arquivo para leitura
                FileReader reader = new FileReader(pathArq);

                //leitor do arquivo
                BufferedReader leitor = new BufferedReader(reader);
                while (true) {
                    dpb.setValue(k);
                    k++;

                    linha = leitor.readLine();
                    if (linha == null) {
                        break;
                    }
                    //mostra += linha + "\n";
                    if (linha.contains("[Measurement Info") || flag1 && !linha.contains("[DESCRIPTION]")) {
                        // System.out.println(linha);
                        measurement += linha + "\n";
                        flag1 = true;
                    }
                    if (linha.contains("[DESCRIPTION]") || flag2 && !linha.contains("[DATA]")) {
                        flag1 = false;
                        flag2 = true;
                        //  System.out.println(linha);
                        description += linha + "\n";
                    }
                    if (linha.contains("[DATA]") || flag3) {
                        flag2 = false;
                        flag3 = true;
                        //System.out.println(linha);

                        if (!linha.equals("[DATA]")) {
                            String[] split = linha.split(";");
                            String latitude = split[1];
                            String longitude = split[2];
                            String amplitude = split[7];

                            //Elimina os campos sem valores - obs.: podem ser implementado outro tipo de filtro
                            if (!latitude.equals("?") && !longitude.equals("?") && !amplitude.equals("?")) {
                                data.add(new Data(Double.parseDouble(latitude), Double.parseDouble(longitude), Double.parseDouble(amplitude)));
                            }
                        }
                    }
                }
            } catch (Exception erro) {
            }
            //prepara os dados para plotagem e armazena em um diretorio especifico para dados importados
            if (!data.isEmpty()) {
                ImportedModel im = new ImportedModel(arq.getName().replace(".asc", ""), data);
                MyUtility.gravaObjetoParser(im, im.getNomeMedodo());
            } else {
                JOptionPane.showMessageDialog(null, "Dados invalidos", "Erro", 0);
            }
        } //Se nao existir
        else {
            JOptionPane.showMessageDialog(null, "Arquivo nao existe!", "Erro", 0);
        }
        dlg.setVisible(false);
    }

    public String getDescription() {
        return description;
    }

    public String getMeasurement() {
        return measurement;
    }

    public ArrayList<Data> getData() {
        return data;
    }

}
